/* * Hibernate Search, full-text search for your domain model * * License: GNU Lesser General Public License (LGPL), version 2.1 or later * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.search.test.integration.jbossjta; import java.util.HashMap; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.SharedCacheMode; import javax.persistence.ValidationMode; import javax.persistence.spi.PersistenceUnitInfo; import javax.persistence.spi.PersistenceUnitTransactionType; import javax.sql.DataSource; import org.apache.lucene.search.Query; import org.h2.jdbcx.JdbcDataSource; import org.hibernate.ConnectionReleaseMode; import org.hibernate.cfg.Environment; import org.hibernate.dialect.H2Dialect; import org.hibernate.engine.transaction.jta.platform.internal.JBossStandAloneJtaPlatform; import org.hibernate.jpa.HibernatePersistenceProvider; import org.hibernate.search.jpa.FullTextEntityManager; import org.hibernate.search.jpa.Search; import org.hibernate.search.query.dsl.QueryBuilder; import org.hibernate.search.test.integration.jbossjta.infra.JBossTADataSourceBuilder; import org.hibernate.search.test.integration.jbossjta.infra.PersistenceUnitInfoBuilder; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionManagerImple; /** * @author Emmanuel Bernard */ public class JBossTSIT { private static EntityManagerFactory factory; @BeforeClass public static void setUp() throws Exception { //DataSource configuration final String url = "jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1"; final String user = "sa"; final String password = ""; //H2 DataSource creation final JdbcDataSource underlyingDataSource = new JdbcDataSource(); underlyingDataSource.setURL( url ); underlyingDataSource.setUser( user ); underlyingDataSource.setPassword( password ); //build JBoss-bound DataSource DataSource ds = new JBossTADataSourceBuilder() .setXADataSource( underlyingDataSource ) .setUser( user ) .setPassword( password ) .setTimeout( 0 ) //infinite transaction .createDataSource(); PersistenceUnitInfoBuilder pub = new PersistenceUnitInfoBuilder(); final PersistenceUnitInfo unitInfo = pub .setExcludeUnlistedClasses( true ) .setJtaDataSource( ds ) .setPersistenceProviderClassName( HibernatePersistenceProvider.class.getName() ) .setPersistenceUnitName( "jbossjta" ) .setPersistenceXMLSchemaVersion( "2.0" ) .setSharedCacheMode( SharedCacheMode.NONE ) .setValidationMode( ValidationMode.NONE ) .setTransactionType( PersistenceUnitTransactionType.JTA ) .addManagedClassNames( Tweet.class.getName() ) .addProperty( "hibernate.dialect", H2Dialect.class.getName() ) .addProperty( Environment.HBM2DDL_AUTO, "create-drop" ) .addProperty( Environment.SHOW_SQL, "true" ) .addProperty( Environment.JTA_PLATFORM, JBossStandAloneJtaPlatform.class.getName() ) //I don't pool connections by JTA transaction. Leave the work to Hibernate Core .addProperty( Environment.RELEASE_CONNECTIONS, ConnectionReleaseMode.AFTER_TRANSACTION.toString() ) .addProperty( "hibernate.search.default.directory_provider", "ram" ) .create(); final HibernatePersistenceProvider hp = new HibernatePersistenceProvider(); factory = hp.createContainerEntityManagerFactory( unitInfo, new HashMap() ); } @AfterClass public static void tearDown() throws Exception { if ( factory != null ) { factory.close(); } } @Test public void testJBossTS() throws Exception { TransactionManagerImple tm = new TransactionManagerImple(); tm.begin(); EntityManager em = factory.createEntityManager(); Tweet tweet = new Tweet( "Spice is the essence of life" ); em.persist( tweet ); tm.commit(); em.close(); tm.begin(); em = factory.createEntityManager(); FullTextEntityManager ftem = Search.getFullTextEntityManager( em ); final QueryBuilder builder = ftem.getSearchFactory().buildQueryBuilder().forEntity( Tweet.class ).get(); final Query query = builder .keyword() .onField( "text" ) .matching( "spice" ) .createQuery(); ftem.createFullTextQuery( query, Tweet.class ).getResultList(); final List resultList = em.createQuery( "from " + Tweet.class.getName() ).getResultList(); Assert.assertEquals( 1, resultList.size() ); for ( Object o : resultList ) { em.remove( o ); } tm.commit(); em.close(); } }